import math
import random

class Heart:
    @staticmethod
    def generate_points(center_x, center_y, size=20, points_count=30):
        """生成爱心形状的轮廓点
        
        使用参数方程生成爱心形状：
        x = 16 * (sin(t))^3
        y = 13 * cos(t) - 5 * cos(2t) - 2 * cos(3t) - cos(4t)
        
        Args:
            center_x (float): 爱心中心的x坐标
            center_y (float): 爱心中心的y坐标
            size (float): 爱心的大小
            points_count (int): 生成的点的数量
            
        Returns:
            list: 包含(x, y)坐标的点列表
        """
        points = []
        for i in range(points_count):
            # 参数t从0到2π
            t = (i / points_count) * 2 * math.pi
            # 计算参数方程
            x = 16 * math.pow(math.sin(t), 3)
            y = -(13 * math.cos(t) - 5 * math.cos(2*t) - 2 * math.cos(3*t) - math.cos(4*t))
            # 缩放并移动到指定位置
            x = x * size / 16 + center_x
            y = y * size / 16 + center_y
            points.append((x, y))
        return points

    @staticmethod
    def generate_fill_points(center_x, center_y, size=20, density=0.5):
        """生成爱心内部的填充点
        
        Args:
            center_x (float): 爱心中心的x坐标
            center_y (float): 爱心中心的y坐标
            size (float): 爱心的大小
            density (float): 填充点的密度（0到1之间）
            
        Returns:
            list: 包含(x, y)坐标的点列表
        """
        points = []
        # 在爱心范围内随机生成点
        box_size = size * 2
        points_count = int(box_size * box_size * density)
        
        for _ in range(points_count):
            # 在方框范围内随机生成点
            x = center_x + random.uniform(-size, size)
            y = center_y + random.uniform(-size, size)
            
            # 检查点是否在爱心内部
            if Heart.is_point_in_heart(x, y, center_x, center_y, size):
                points.append((x, y))
                
        return points
    
    @staticmethod
    def is_point_in_heart(x, y, center_x, center_y, size):
        """检查点是否在爱心内部
        
        使用简化的爱心方程：(x^2 + y^2 - 1)^3 - x^2*y^3 <= 0
        
        Args:
            x, y: 要检查的点的坐标
            center_x, center_y: 爱心中心的坐标
            size: 爱心的大小
            
        Returns:
            bool: 如果点在爱心内部则返回True
        """
        # 将点转换到以爱心中心为原点的坐标系
        x = (x - center_x) / size
        y = (y - center_y) / size
        
        # 爱心方程
        value = math.pow(x*x + y*y - 1, 3) - x*x * math.pow(y, 3)
        return value <= 0

if __name__ == "__main__":
    import random
    # 测试代码
    points = Heart.generate_points(0, 0)
    print("Outline points:", points[:5], "...")
    fill_points = Heart.generate_fill_points(0, 0)
    print("Fill points:", fill_points[:5], "...")